package dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


import utils.Constantes;
import utils.Utils;

import model.Atendimento;
import model.Cliente;
import model.Usuario;
import model.Status;

public class AtendimentoDao extends GenericDao{
	
	
		
		public AtendimentoDao(){
			super();
			Class<?> clazz = null;
			try {
				clazz=Class.forName("model."+this.getClass().getSimpleName().replace("Dao", ""));
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			this.setNumerodecampos(clazz.getDeclaredFields().length);
			
		}
		
		public PreparedStatement adicionar(Atendimento atendimento) throws SQLException{
				
//				String sql = "insert into atendimento(data,horario,idcliente) values (?,?,?,?,?)";
				String sql =this.insertInto(atendimento);
				
				super.setQuery(sql);
				ArrayList<Integer> indexes=new ArrayList<Integer>();
				for (int i=0;i<this.getNumerodecampos();i++)
					indexes.add(i,i+1);
				indexes.add(this.getNumerodecampos(),null);
				
				PreparedStatement stmt = this.loadModelToPreparedStatement(atendimento,indexes);
				
				stmt.execute();	
				outQuery(stmt.toString());
				this.setQuery(stmt.toString());

				stmt.close();
				
				con.close();
				return stmt;
				
		}
		

	public PreparedStatement desativar(Atendimento atendimento) throws SQLException{
			String sql = "update atendimento set ativo = 'N' where idatendimento = ?";
			
			this.setQuery(sql);
			ArrayList<Integer> indexes=new ArrayList<Integer>();
			for (int i=0;i<this.getNumerodecampos();i++)
				indexes.add(i,null);
			indexes.add(this.getNumerodecampos(),1);
			PreparedStatement stmt = this.loadModelToPreparedStatement(atendimento, indexes);
			
			stmt.execute();
			outQuery(stmt.toString());
			this.setQuery(stmt.toString());
			
			stmt.close();
			
			con.close();
			
			return stmt;
			
			

	}
	
	public PreparedStatement ativar(Atendimento atendimento) throws SQLException{
		String sql = "update atendimento set ativo = 'S' where idatendimento = ?";
		
		this.setQuery(sql);
		ArrayList<Integer> indexes=new ArrayList<Integer>();
		for (int i=0;i<this.getNumerodecampos();i++)
			indexes.add(i,null);
		indexes.add(this.getNumerodecampos(),1);
		PreparedStatement stmt = this.loadModelToPreparedStatement(atendimento, indexes);
		
		stmt.execute();
		outQuery(stmt.toString());
		this.setQuery(stmt.toString());

		stmt.close();
		
		con.close();
		
		return stmt;
		
		

}

		

	public PreparedStatement alterar(Atendimento atendimento) throws SQLException{
			
//			String sql = "update atendimento set data = ?,horario = ?,idcliente = ?" +
//					" where idatendimento = ? and ativo = 'S'";
			String sql = "update atendimento set data = ?,horario = ?,vencimento = ?, idstatus = ?,idcliente = ?" +
			" where idatendimento = ? and ativo = 'S'";
		
			this.setQuery(sql);
			ArrayList<Integer> indexes=new ArrayList<Integer>();
			for (int i=0;i<=this.getNumerodecampos();i++)
				indexes.add(i,i+1);
			
			
			PreparedStatement stmt =this.loadModelToPreparedStatement(atendimento,indexes); 
				
			
			
			
			stmt.execute();
			outQuery(stmt.toString());
			this.setQuery(stmt.toString());

			stmt.close();
			
			con.close();
			return stmt;
			
	}
	



		


		public ArrayList<Atendimento> getAtendimentos(Atendimento atendimentoBusca, int limite, int inicio) throws SQLException{
			String sql = "select * from atendimento where ativo = 'S'";
			
			this.setQuery(sql);
			ArrayList<Integer> restrictions=this.prepareRestrictionsQuery(atendimentoBusca,null);
			this.addOrder("desc","data");
			this.addLimit(limite,inicio);
			
			PreparedStatement stmt =this.addRestrictions(atendimentoBusca,null,restrictions);
					
			ResultSet rs = stmt.executeQuery();
			outQuery(stmt.toString());
			Atendimento atendimento = null;
			ArrayList<Atendimento> atendimentos=new ArrayList<Atendimento>();
			
			while(rs.next()){
				atendimento = this.loadResultSetToModel(rs);
				atendimentos.add(atendimento);
				
			} 
			this.setQuery(stmt.toString());

			stmt.close();
			rs.close();
			con.close();
			
			return atendimentos;
			
		}
		
		public ArrayList<Atendimento> getAtendimentos(Atendimento atendimentoBusca,Usuario usuario, int limite, int inicio) throws SQLException{
			String sql = "select * from atendimento where ativo = 'S'";
			
			this.setQuery(sql);
			ArrayList<Integer> restrictions=this.prepareRestrictionsQuery(atendimentoBusca,usuario);
			
			
			this.addOrder("desc","data");
			this.addLimit(limite,inicio);
			
			PreparedStatement stmt =this.addRestrictions(atendimentoBusca,usuario,restrictions);
			
					
			ResultSet rs = stmt.executeQuery();
			outQuery(stmt.toString());
			Atendimento atendimento = null;
			ArrayList<Atendimento> atendimentos=new ArrayList<Atendimento>();
			
			while(rs.next()){
				atendimento = this.loadResultSetToModel(rs);
				atendimentos.add(atendimento);
				
			} 
			this.setQuery(stmt.toString());

			stmt.close();
			rs.close();
			con.close();
			
			return atendimentos;
			
		}
		
		
		public Integer countGetAtendimentos(Atendimento atendimentoBusca,Usuario usuario) throws SQLException{
			String sql = "select count(*) as count from atendimento where ativo = 'S'";
			
			this.setQuery(sql);
			ArrayList<Integer> restrictions=this.prepareRestrictionsQuery(atendimentoBusca,usuario);
			
			PreparedStatement stmt =this.addRestrictions(atendimentoBusca,usuario,restrictions);
					
			ResultSet rs = stmt.executeQuery();
			outQuery(stmt.toString());
			Integer count = new Integer(0);
			
			while(rs.next()){
				
				
				if (!Utils.isBlank(rs.getInt(Constantes.COUNT)))
					count=rs.getInt(Constantes.COUNT);
			} 
			this.setQuery(stmt.toString());

			stmt.close();
			rs.close();
			con.close();
			
			return count;
			
		}
		

		private PreparedStatement addRestrictions(Atendimento atendimento, Usuario usuario,
				ArrayList<Integer> indexes) throws SQLException {
			PreparedStatement stmt=con.prepareStatement(this.getQuery());
			
			if (!Utils.isBlank(indexes.get(0)))
				stmt.setDate(indexes.get(0), Utils.StringToDate(atendimento.getData()));
			
			if (!Utils.isBlank(indexes.get(1)))
				stmt.setTime(indexes.get(1), Utils.StringToTime(atendimento.getHorario()));
			
			if (!Utils.isBlank(indexes.get(2)))
				stmt.setDate(indexes.get(2), Utils.StringToDate(atendimento.getData()));
			
			if (!Utils.isBlank(indexes.get(3)))
				stmt.setInt(indexes.get(3), atendimento.getStatus().getId());
			
			if (!Utils.isBlank(indexes.get(4)))
				stmt.setInt(indexes.get(4), atendimento.getCliente().getId());
			
			if (!Utils.isBlank(indexes.get(5)))
				stmt.setInt(indexes.get(5), atendimento.getId());
			
			if (usuario!=null)
			if (!Utils.isBlank(indexes.get(6)))
				stmt.setInt(indexes.get(6), usuario.getId());
			
				
			return stmt;
		}


		


		private ArrayList<Integer> prepareRestrictionsQuery(
				Atendimento atendimento,Usuario usuario) {
			ArrayList<Integer> restrictions=new ArrayList<Integer>();	
			int index=0;
			String sql=this.getQuery();
			
			restrictions.add(0, null);
			if (!Utils.isBlank(atendimento.getData())){
				sql+=" and data = ?";
				index++;
				restrictions.add(0, index);
			}
			
			
			
			restrictions.add(1, null);
			if (!Utils.isBlank(atendimento.getHorario())){
				sql+=" and horario = ?";
				index++;
				restrictions.add(1, index);
			}
			
			restrictions.add(2, null);
			if (!Utils.isBlank(atendimento.getVencimento())){
				sql+=" and vencimento = ?";
				index++;
				restrictions.add(2, index);
			}
			
			
			
			
			restrictions.add(3, null);
			if ((!Utils.isBlank(atendimento.getStatus())) &&
				(!Utils.isBlank(atendimento.getStatus().getId()))
				){
				sql+=" and idstatus = ?";
				index++;
				restrictions.add(3, index);
			}
			
			
			
			restrictions.add(4, null);
			if ((!Utils.isBlank(atendimento.getCliente())) &&
				(!Utils.isBlank(atendimento.getCliente().getId()))
				){
				sql+=" and idcliente = ?";
				index++;
				restrictions.add(4, index);
			}
			
			
			
			restrictions.add(5, null);
			if (!Utils.isBlank(atendimento.getId())){
				sql+=" and idatendimento = ?";
				index++;
				restrictions.add(5, index);
			}
			
			
			restrictions.add(6,null);
			if ((usuario!=null)&&(!Utils.isBlank(usuario.getId()))){
				sql+=" and idatendimento in (select idatendimento from item where idhabilitacao in (select idhabilitacao from habilitacao where idusuario = ?))";
				index++;
				restrictions.add(6,index);
			}
				
			
				
			this.setQuery(sql);
			return restrictions;
		}


		private Atendimento loadResultSetToModel(ResultSet rs) throws SQLException {
			Atendimento atendimento = new Atendimento();
			
			if (!Utils.isBlank(rs.getInt(Constantes.IDATENDIMENTO)))
			atendimento.setId(rs.getInt(Constantes.IDATENDIMENTO));
			
			Cliente cliente = new Cliente();
			if (!Utils.isBlank(rs.getInt(Constantes.IDCLIENTE)))
			cliente.setId(rs.getInt(Constantes.IDCLIENTE));
			ClienteDao cdao = new ClienteDao();
			atendimento.setCliente(cdao.getClientes(cliente,0,0).get(0));
			
			Status status = new Status();
			if (!Utils.isBlank(rs.getInt(Constantes.IDSTATUS)))
			status.setId(rs.getInt(Constantes.IDSTATUS));
			StatusDao statusDao = new StatusDao();
			atendimento.setStatus(statusDao.getStatuss(status,0,0).get(0));
			
			
			if (!Utils.isBlank(rs.getDate(Constantes.DATA)))
			atendimento.setData(Utils.DateToString(rs.getDate(Constantes.DATA)));
			
			if (!Utils.isBlank(rs.getDate(Constantes.VENCIMENTO)))
				atendimento.setVencimento(Utils.DateToString(rs.getDate(Constantes.VENCIMENTO)));
				
			
			if (!Utils.isBlank(rs.getTime(Constantes.HORARIO)))		
				atendimento.setHorario(Utils.TimeToString(rs.getTime(Constantes.HORARIO)));
			
			
			
			return atendimento;
		}





		private PreparedStatement loadModelToPreparedStatement(
				Atendimento atendimento, ArrayList<Integer> indexes) throws SQLException {
			PreparedStatement stmt=con.prepareStatement(this.getQuery());
			
			if (!Utils.isBlank(indexes.get(0)))
				stmt.setDate(indexes.get(0), Utils.StringToDate(atendimento.getData()));
			
			if (!Utils.isBlank(indexes.get(1)))
				stmt.setTime(indexes.get(1), Utils.StringToTime(atendimento.getHorario()));
			
			if (!Utils.isBlank(indexes.get(2)))
				stmt.setDate(indexes.get(2), Utils.StringToDate(atendimento.getVencimento()));
			
			if (!Utils.isBlank(indexes.get(3)))
				stmt.setInt(indexes.get(3), atendimento.getStatus().getId());
			
			if (!Utils.isBlank(indexes.get(4)))
				stmt.setInt(indexes.get(4), atendimento.getCliente().getId());
			
			if (!Utils.isBlank(indexes.get(5)))
				stmt.setInt(indexes.get(5), atendimento.getId());
			
				
			return stmt;
		}
		
}

